Сравнение (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Сравне́ние в программировании — общее название ряда операций над па́рами значений одного типа, либо с приведением типа, реализующих математические отношения равенства и порядка. В языках высокого уровня такие операции, чаще всего, возвращают булево значение («истина» или «ложь»).

По-разному рассматривается сравнение скалярных (числовых) объектов, указателей и объектов сложных типов данных.

Сравнение скалярных типов данных

[править | править код]

При сравнении объектов скалярных (числовых) типов данных сравниваются непосредственно сами хранимые числовые значения. Сами числовые значения, при этом, остаются неизменными.

В языках низкого уровня скалярные объекты записываются в регистры процессора, а для их сравнения используется, обычно, команда CMP, которая определённым образом устанавливает флаги процессора.

В языках высокого уровня используются логические операторы, которые возвращают (в точку вызова) некоторое значение, которое интерпретируется как логическое.

Логические операторы реализуют следующие математические операции сравнения:

  • Проверка на равенство () или/и неравенство ();
  • Проверка на строгое неравенство ( и );
  • Проверка на нестрогое неравенство ( и ).

В языках высокого уровня, соответственно, реализованы следующие логические операторы:

  • Проверка на равенство (= в Паскале и == в Си) и неравенства (<> в Паскале и != в Си);
  • Отношение строгого порядка (< и >);
  • Отношение нестрогого порядка (<=, >=).

В языках со слабой типизацией возвращаемое значение, обычно, является целым числом так, что нулевое значение интерпретируется как «ложь», а любое отличное от нуля значение — как «истина». В языках с более сильной типизацией вводится специальный логический тип данных (англ. boolean), но возможно приведение других типов к логическому.

Сравнение нечисловых данных

[править | править код]

Даже если аргументы сравнения не представляют собой числовые данные, их сравнение всё равно может быть реализовано, в том числе как часть стандарта языка программирования. При работе со сложными объектами программа оперирует с ними с помощью указателей. Таким образом, появляется как минимум два варианта сравнения данных:

  • Сравнение указателей — сравнение значений указателей. Равенство указателей означает, что две переменных указывают на один и тот же объект данных (участок памяти).
  • Сравнение содержимого — сравнение объектов с точки зрения логики на основе знания их содержимого. Например, сравнение строк.

Некоторые языки, ограничивающие работу с указателями, например, Java, хотя не позволяют сравнивать указатели операндами больше-меньше, позволяют проверить равенство указателей.

Сравнение содержимого, например, сравнение строк, чаще всего встроена в реализацию среды исполнения для языка и может являться частью стандарта. Однако допускается самостоятельная реализация правил сравнения содержимого для пользовательских структур путём перегрузки операторов (Си) или определения (переопределения) методов (Object.equals и интерфейс Comparable в Java). Для встроенных типов данных (например, String) хотя часто нельзя переопределить правила сравнения, их можно настроить с учётом текущей языка и локализации, а также использовать собственные реализации правил сравнения с функциями сортировки (интерфейс Comparator в Java).

Некоторые стандарты, например DOM Level 3, определяет дополнительные типы эквивалентности. В частности, стандарт DOM Level 3 предполагает, что один и тот же элемент документа может быть представлен двумя и более участками в памяти компьютера. Поэтому определяется дополнительная операция isSameNode, которая является проверкой равенства содержимого с точки зрения языка программирования, но фактически является проверкой эквивалентности указателей с точки зрения стандарта DOM.[1]

В некоторых языках в качестве эквивалентных также могут рассматриваться значения близкие по смысловой нагрузке, хотя и имеющие разные типы, например, пустая строка, пустой массив, число 0, нулевой (null) указатель, ложь — имеют смысл пустоты, отрицания.

Примечания

[править | править код]
  1. Document Object Model Core. Дата обращения: 11 февраля 2010. Архивировано 11 февраля 2010 года.